/**
 * 迷失的指针或引用，让互斥量的保护形同虚设
 * 
 */

#include <mutex>
#include <iostream>

class some_data
{
    int a;
    std::string b;
public:
    void do_something()
    {
        std::cout << "operate data" << std::endl;
    }
};

class data_wrapper
{
private:
    some_data data;
    std::mutex m;
public:
    template<typename Function>
    void process_data(Function func)
    {
        std::lock_guard<std::mutex> l(m);
        func(data);
    }
};

some_data* unprotected;

void malicious_function(some_data& protected_data) //传递了保护数据的引用;切勿将收保护数据的指针或引用传递到互斥锁作用域之外
{
    unprotected=&protected_data;
}

data_wrapper x; // 数据封装

void foo()
{
    x.process_data(malicious_function);  
    unprotected->do_something(); // 在没有锁保护的情况下操作数据
}

int main()
{
    foo();
}
